# Author: Luke McEvoy
# Contact: lukemcevoy7@hotmail.com, 631-478-9254
# OKC Data Science Take Home Summer 2022
# Import Libraries
import pandas as pd
import seaborn as sns
import math
import matplotlib.pyplot as plt
from matplotlib.patches import Circle, Rectangle, Arc
# Read data on Team A and B shooting
okc_df = pd.read_csv('/Users/lukemcevoy/Develop/self/work/interviews/okc/nba-data-visualization/shots_data.csv')
# Plot Team A and B's heatmap of all shots (made and missed)
cmap = plt.cm.Greens_r
joint_shot_chart = sns.jointplot(x=okc_df['x'], y=okc_df['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Shots from Team A and B')
plt.show()
okc_df_made = okc_df[okc_df['fgmade']==1]
okc_df_miss = okc_df[okc_df['fgmade']==0]
# Plot Team A and B's heatmap of all made shots
cmap = plt.cm.Greens_r
joint_shot_chart = sns.jointplot(x=okc_df_made['x'], y=okc_df_made['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Made Shots from Team A and B')
plt.show()
# Plot Team A and B's heatmap of all missed shots
cmap = plt.cm.Greens_r
joint_shot_chart = sns.jointplot(x=okc_df_miss['x'], y=okc_df_miss['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Missed Shots from Team A and B')
plt.show()
# Split read dataframe (df) on team. Two dfs, one of Team A one of Team B
mask = okc_df['team'] == 'Team A'
team_a = okc_df[mask]
team_b = okc_df[~mask]
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_a['x'], y=team_a['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Shots from Team A')
plt.show()
team_a_made = team_a[team_a['fgmade']==1]
team_a_miss = team_a[team_a['fgmade']==0]
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_a_made['x'], y=team_a_made['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Made Shots from Team A')
plt.show()
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_a_miss['x'], y=team_a_miss['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Missed Shots from Team A')
plt.show()
cmap = plt.cm.Blues_r
joint_shot_chart = sns.jointplot(x=team_b['x'], y=team_b['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Shots from Team B')
plt.show()
team_b_made = team_b[team_b['fgmade']==1]
team_b_miss = team_b[team_b['fgmade']==0]
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_b_made['x'], y=team_b_made['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Made Shots from Team B')
plt.show()
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_b_miss['x'], y=team_b_miss['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All Missed Shots from Team B')
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(okc_df['x'], okc_df['y'], c=okc_df['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Shots (Blue made, Red missed) from Team A and B")
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_a['x'], team_a['y'], c=team_a['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Shots (Blue made, Red missed) from Team A")
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_b['x'], team_b['y'], c=team_b['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Shots (Blue made, Red missed) from Team B")
plt.show()
team_a_corner_3s = team_a.loc[(team_a['y'] <= 7.8) & ((team_a['x'] > 22) | (team_a['x'] < -22))]
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_a_corner_3s['x'], y=team_a_corner_3s['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-2,7.8)
plt.title('Corner 3 Shots from Team A')
plt.show()
team_b_corner_3s = team_b.loc[(team_b['y'] <= 7.8) & ((team_b['x'] > 22) | (team_b['x'] < -22))]
cmap = plt.cm.Reds_r
joint_shot_chart = sns.jointplot(x=team_b_corner_3s['x'], y=team_b_corner_3s['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-3,7.8)
plt.title('Corner 3 Shots from Team B')
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_a_corner_3s['x'], team_a_corner_3s['y'], c=team_a_corner_3s['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([0, 7.8])
plt.title("All Corner 3 Shots (Blue made, Red missed) from Team A")
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_b_corner_3s['x'], team_b_corner_3s['y'], c=team_b_corner_3s['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([0, 7.8])
plt.title("All Corner 3 Shots (Blue made, Red missed) from Team B")
plt.show()
team_a_non_corner_3s = team_a.loc[(team_a['y'] > 7.8)]
for index, row in team_a_non_corner_3s.iterrows():
if math.hypot(row['x'], row['y']) < 23.75:
team_a_non_corner_3s = team_a_non_corner_3s.drop(index)
cmap = plt.cm.Blues_r
joint_shot_chart = sns.jointplot(x=team_a_non_corner_3s['x'], y=team_a_non_corner_3s['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(7,35)
plt.title('All Non Corner 3s from Team A')
plt.show()
team_b_non_corner_3s = team_b.loc[(team_b['y'] > 7.8)]
for index, row in team_b_non_corner_3s.iterrows():
if math.hypot(row['x'], row['y']) < 23.75:
team_b_non_corner_3s = team_b_non_corner_3s.drop(index)
cmap = plt.cm.Blues_r
joint_shot_chart = sns.jointplot(x=team_b_non_corner_3s['x'], y=team_b_non_corner_3s['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(7,35)
plt.title('All Non Corner 3s from Team B')
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_a_non_corner_3s['x'], team_a_non_corner_3s['y'], c=team_a_non_corner_3s['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Non Corner 3s (Blue made, Red missed) from Team A")
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_b_non_corner_3s['x'], team_b_non_corner_3s['y'], c=team_b_non_corner_3s['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Non Corner 3s (Blue made, Red missed) from Team B")
plt.show()
team_a_two_pointers = []
for index, row in team_a.iterrows():
if row['y'] <= 7.8 and (row['x'] < 22 or row['x'] > -22):
team_a_two_pointers.append(row)
if row['y'] > 7.8 and math.hypot(row['x'],row['y']) < 23.75:
team_a_two_pointers.append(row)
team_a_two_pointers_df = pd.DataFrame(team_a_two_pointers)
cmap = plt.cm.Blues_r
joint_shot_chart = sns.jointplot(x=team_a_two_pointers_df['x'], y=team_a_two_pointers_df['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All 2 Pointers from Team A')
plt.show()
team_b_two_pointers = []
for index, row in team_b.iterrows():
if row['y'] <= 7.8 and (row['x'] < 22 or row['x'] > -22):
team_b_two_pointers.append(row)
if row['y'] > 7.8 and math.hypot(row['x'],row['y']) < 23.75:
team_b_two_pointers.append(row)
team_b_two_pointers_df = pd.DataFrame(team_b_two_pointers)
cmap = plt.cm.Blues_r
joint_shot_chart = sns.jointplot(x=team_b_two_pointers_df['x'], y=team_b_two_pointers_df['y'], kind='kde', space=0, color=cmap(0.1), cmap=cmap, n_levels=50)
joint_shot_chart.fig.set_size_inches(12,10)
ax = joint_shot_chart.ax_joint
ax.set_xlim(-30,30)
ax.set_ylim(-5,35)
plt.title('All 2 Pointers from Team B')
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_a_two_pointers_df['x'], team_a_two_pointers_df['y'], c=team_a_two_pointers_df['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Two Pointers (Blue made, Red missed) from Team A")
plt.show()
plt.figure(figsize=(12, 10))
plt.scatter(team_b_two_pointers_df['x'], team_b_two_pointers_df['y'], c=team_b_two_pointers_df['fgmade'], cmap='coolwarm_r')
cur_axes = plt.gca()
plt.xlim([-30, 30])
plt.ylim([-5, 35])
plt.title("All Two Pointers (Blue made, Red missed) from Team B")
plt.show()
def eFG(fgm, fga, threepm):
return (fgm + (0.5 + threepm)) / fga
team_a_two_pointer_fgm = len(team_a_two_pointers_df[team_a_two_pointers_df['fgmade'] == 1])
team_a_two_pointer_fga = len(team_a_two_pointers_df)
print('Team A Two Pointer FG % = ', team_a_two_pointer_fgm / team_a_two_pointer_fga)
team_b_two_pointer_fgm = len(team_b_two_pointers_df[team_b_two_pointers_df['fgmade'] == 1])
team_b_two_pointer_fga = len(team_b_two_pointers_df)
print('Team B Two Pointer FG % = ', team_b_two_pointer_fgm / team_b_two_pointer_fga)
team_a_corner_3s_fgm = len(team_a_corner_3s[team_a_corner_3s['fgmade'] == 1])
team_a_corner_3s_fga = len(team_a_corner_3s)
print('Team A Corner 3 FG % = ', team_a_corner_3s_fgm / team_a_corner_3s_fga)
team_b_corner_3s_fgm = len(team_b_corner_3s[team_b_corner_3s['fgmade'] == 1])
team_b_corner_3s_fga = len(team_b_corner_3s)
print('Team B Corner 3 FG % = ', team_b_corner_3s_fgm / team_b_corner_3s_fga)
team_a_non_corner_3s_fgm = len(team_a_non_corner_3s[team_a_non_corner_3s['fgmade'] == 1])
team_a_non_corner_3s_fga = len(team_a_non_corner_3s)
print('Team A Non Corner 3 FG % = ', team_a_non_corner_3s_fgm / team_a_non_corner_3s_fga)
team_b_non_corner_3s_fgm = len(team_b_non_corner_3s[team_b_non_corner_3s['fgmade'] == 1])
team_b_non_corner_3s_fga = len(team_b_non_corner_3s)
print('Team B Non Corner 3 FG % = ', team_b_non_corner_3s_fgm / team_b_non_corner_3s_fga)
print('Team A EFG', eFG(team_a_non_corner_3s_fgm, team_a_non_corner_3s_fga, team_a_corner_3s_fgm + team_a_non_corner_3s_fgm))
print('Team B EFG', eFG(team_b_non_corner_3s_fgm, team_b_non_corner_3s_fga, team_b_corner_3s_fgm + team_b_non_corner_3s_fgm))
# 5. What percentage of Team A's shots were attempted in the 2PT zone
team_a_two_pointer_fga / len(team_a)
# 6. What percentage of Team A's shots were attemped in non corner 3 zone
team_a_non_corner_3s_fga / len(team_a)
# 7. What percentage of Team A's shots were attempted in corner 3 zone
team_a_corner_3s_fga / len(team_a)
# 8910What was the eFG in the 2PT zone for Team A
eFG()